home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: C/C++ / Resource for Source - C-C++.iso / misc_src / knowhow4 / edit.cpp < prev    next >
C/C++ Source or Header  |  1995-11-01  |  7KB  |  268 lines

  1. #include "edit.h"
  2. #include <string.h>
  3. #include "addevent.h"
  4.  
  5. #include <iostream.h>
  6.  
  7. #include "ljfonts.h"
  8. #include "textlast.h"
  9.  
  10. int text_last(char* str)            // returns len after last '\n'
  11.     {
  12.     char* st = str;
  13.     char* s;
  14.     while(1)
  15.     {
  16.     s = strchr(st, '\n');
  17.     if(!s)
  18.         break;
  19.     st = s + 1;
  20.     }
  21.     return strlen(st);
  22.     }
  23. ////////////////////////////
  24.  
  25. inline void moveto(loc xy, int dir)
  26.     {
  27.     if(dir) moveto(xy.Y, getmaxx() - xy.X);
  28.     else moveto(xy);
  29.     }
  30. ////////////////////
  31. inline int getmaxx(int dir)
  32.     {
  33.     if(dir) return getmaxy();
  34.     return getmaxx();
  35.     }
  36. ///////////////////
  37. inline int getmaxy(int dir)
  38.     {
  39.     if(dir) return getmaxx();
  40.     return getmaxy();
  41.     }
  42. ////////////////////
  43. int text_width(char* str, ljfont* fnt, int DATA_SIZE)       // correct return len of str, when str is
  44.     {                           // line of deformated BGI characters
  45.     int len = 0;
  46.     char s[2];
  47.     s[1] = '\0';
  48.     int n = strlen(str);
  49.     while(n > 0)
  50.     {
  51.     s[0] = str[n - 1];
  52.     len += fnt->scaledtextsize(s, DATA_SIZE, DATA_SIZE).width();
  53.     n--;
  54.     }
  55.     return len;
  56.     }
  57. //////////////////////////
  58. void text_out(loc where, char* str, ljfont* fnt, int mode, int DATA_DIR,
  59.     int DATA_SIZE)
  60.     {
  61.     int len = 0;
  62.     char st[500];
  63.     strncpy(st, str, 499);
  64.     char* s;
  65.     moveto(where, DATA_DIR);
  66.     while(1)
  67.     {
  68.     s = strchr(str + len, '\n');
  69.     if(!s)
  70.         {
  71.         drawscaledstr(*fnt, str + len, DATA_SIZE, DATA_SIZE, mode,
  72.         DATA_DIR);
  73.  
  74.         break;
  75.         }
  76.     strncpy(st, str + len, s - str - len);
  77.     st[s - str - len] = '\0';
  78.  
  79.     len = s - str + 1;
  80.     moveto(where, DATA_DIR);
  81.     drawscaledstr(*fnt, st, DATA_SIZE, DATA_SIZE, mode,
  82.         DATA_DIR);
  83.  
  84.     if(!DATA_DIR)
  85.         where.Y += 3 * fnt->scaledtextsize("H!", DATA_SIZE,
  86.         DATA_SIZE).height() / 2;
  87.     else
  88.         where.Y -= 3 * fnt->scaledtextsize("H!", DATA_SIZE,
  89.         DATA_SIZE).height() / 2;
  90.     moveto(where, DATA_DIR);
  91.     }
  92.     }
  93. //////////////////////////////
  94. void text_edit1(loc mspos, rect r, ljfont* fnt, int DATA_SIZE, int DATA_DIR,
  95.     int DATA_ATTR)
  96.     {
  97.     char* str = new char[5000];         // work buffer
  98.     str[0] = '\0';         // end of line
  99.  
  100.     setviewport(r.origin.X, r.origin.Y, r.corner.X, r.corner.Y, 1);
  101.  
  102.     loc res_pos = mspos = mspos - r.origin;    // str beginning - for ESC only
  103.     if(DATA_DIR)
  104.     res_pos = mspos = loc(mspos.Y, getmaxx() - mspos.X);
  105.  
  106.     int len = 0;                      // last string len
  107.     mouseHideCursor();
  108.     setwritemode(XOR_PUT);
  109.     setcolor(WHITE);
  110.     moveto(mspos, DATA_DIR);
  111.     drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  112.          XOR_PUT, DATA_DIR );         // show "_"
  113.     while(1)
  114.     {
  115. // get char
  116.     get_event(1);
  117. // cancel string
  118.     if((e.what == MOUSEEVENT && e.msstatus.buttonstate == MOUSERIGHT) ||
  119.         (e.what == KEYEVENT && e.key == EVENT_ESC))
  120.         {
  121.         moveto(mspos, DATA_DIR);
  122.         drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  123.          XOR_PUT, DATA_DIR );     // remove "_"
  124.         text_out(res_pos, str, fnt, XOR_PUT, DATA_DIR, DATA_SIZE);        // hide str
  125.         len = 0;
  126.         str[0] = '\0';
  127.         moveto(res_pos, DATA_DIR);
  128.         mspos = res_pos;
  129.         drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  130.          XOR_PUT, DATA_DIR );     // show "_"
  131.         }
  132. // accept string
  133.     else if((e.what == MOUSEEVENT && e.msstatus.buttonstate == MOUSELEFT)
  134.         || (e.what == KEYEVENT && e.key == EVENT_F2))
  135.         {
  136.         moveto(mspos, DATA_DIR);
  137.         drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  138.          XOR_PUT, DATA_DIR );     // remove "_"
  139.         setwritemode(COPY_PUT);
  140.         setcolor(DATA_ATTR);
  141.         text_out(res_pos, str, fnt, COPY_PUT, DATA_DIR, DATA_SIZE);        // rewrite str with current color
  142.         break;
  143.         }
  144.     else                               // not ESC and not OK
  145.         switch(e.key)
  146.         {
  147.         case EVENT_RETURN:
  148.             moveto(mspos, DATA_DIR);
  149.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  150.              XOR_PUT, DATA_DIR );     // remove "_"
  151.  
  152.             if(!DATA_DIR)
  153.             mspos.Y += 3 * fnt->scaledtextsize("H!", DATA_SIZE,
  154.                 DATA_SIZE).height() / 2;
  155.             else
  156.             mspos.Y -= 3 * fnt->scaledtextsize("H!", DATA_SIZE,
  157.                 DATA_SIZE).height() / 2;
  158.  
  159.             mspos.X = res_pos.X;
  160.  
  161.             str[strlen(str) + 1] = '\0';
  162.             str[strlen(str)] = '\n';
  163.             len = 0;
  164.             moveto(mspos, DATA_DIR);
  165.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  166.              XOR_PUT, DATA_DIR );          // show "_"
  167.             break;
  168.         case EVENT_BKSP:
  169.             if(str[0] == '\0')    // line beginning
  170.             break;
  171.             if(!len)        // we are trying to remove '\n'
  172.             {
  173.             str[strlen(str) - 1] = '\0';
  174.             len = text_last(str);
  175.             moveto(mspos, DATA_DIR);
  176.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  177.              XOR_PUT, DATA_DIR );          // remove "_"
  178.  
  179.             if(!DATA_DIR)
  180.                 mspos = loc(res_pos.X +
  181.                     text_width(str
  182.                     + strlen(str) - len, fnt, DATA_SIZE),
  183.                     mspos.Y
  184.                     - 3 * fnt->scaledtextsize("H!",
  185.                     DATA_SIZE, DATA_SIZE).height() / 2);
  186.             else
  187.                 mspos = loc(res_pos.X -
  188.                     text_width(str
  189.                     + strlen(str) - len, fnt, DATA_SIZE),
  190.                     mspos.Y
  191.                     + 3 * fnt->scaledtextsize("H!",
  192.                     DATA_SIZE, DATA_SIZE).height() / 2);
  193.  
  194.             moveto(mspos, DATA_DIR);
  195.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  196.              XOR_PUT, DATA_DIR );  // show "_"
  197.             }
  198.             else    // it is char
  199.             {
  200.             moveto(mspos, DATA_DIR);
  201.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  202.                  XOR_PUT, DATA_DIR );
  203.  
  204.             if(!DATA_DIR)
  205.                 mspos.X -= fnt->scaledtextsize(str + strlen(str)
  206.                 - 1, DATA_SIZE,
  207.                 DATA_SIZE).width();
  208.             else
  209.                 mspos.X += fnt->scaledtextsize(str + strlen(str)
  210.                 - 1, DATA_SIZE,
  211.                 DATA_SIZE).width();
  212.  
  213.             moveto(mspos, DATA_DIR);
  214.             drawscaledstr(*fnt, str + strlen(str) - 1,
  215.                 DATA_SIZE, DATA_SIZE,
  216.                 XOR_PUT, DATA_DIR );
  217.             moveto(mspos, DATA_DIR);
  218.             len--;
  219.             str[strlen(str) - 1] = '\0';
  220.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  221.                  XOR_PUT, DATA_DIR );
  222.             }
  223.             break;
  224.         default:            // input of char
  225.             if(strlen(str) > 5000)
  226.             {
  227.             setviewport(0, 0, getmaxx(), getmaxy(), 1);
  228.             setcolor(DATA_ATTR);
  229.                         delete str;
  230.                         return;
  231.             }
  232.  
  233.             char s[3];
  234.             s[0] = e.key;
  235.             s[1] = '\0';
  236.             moveto(mspos, DATA_DIR);         // remove "_"
  237.  
  238.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  239.                  XOR_PUT, DATA_DIR );
  240.             moveto(mspos, DATA_DIR);
  241.             drawscaledstr(*fnt, s, DATA_SIZE, DATA_SIZE,
  242.                  XOR_PUT, DATA_DIR );
  243.  
  244.             len++;
  245.             str[strlen(str) + 1] = '\0';
  246.             str[strlen(str)] = e.key;
  247.  
  248.             if(!DATA_DIR)
  249.             mspos.X += fnt->scaledtextsize(s,
  250.                 DATA_SIZE, DATA_SIZE).width();
  251.             else
  252.             mspos.X -= fnt->scaledtextsize(s,
  253.                 DATA_SIZE, DATA_SIZE).width();
  254.  
  255.             moveto(mspos, DATA_DIR);
  256.             drawscaledstr(*fnt, "_", DATA_SIZE, DATA_SIZE,
  257.                  XOR_PUT, DATA_DIR );
  258.             }
  259.     }
  260.     setwritemode(COPY_PUT);
  261.     mouseShowCursor();
  262.     setcolor(DATA_ATTR);
  263.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  264.     delete str;
  265.     delete fnt;
  266.     }
  267. ///////////////////////////
  268.